﻿Imports DotNetNuke
Imports DotNetNuke.Common
Imports DotNetNuke.Common.Utilities
Imports DotNetNuke.Common.Lists
Imports DotNetNuke.Entities.Users
Imports DotNetNuke.Entities.Profile
Imports DotNetNuke.Services.Exceptions
Imports DotNetNuke.Security.Roles
Imports DotNetNuke.Security.Profile
Imports DotNetNuke.Services.Localization
Imports DotNetNuke.Services.Mail
Imports DotNetNuke.Security.Membership
Imports DotNetNuke.UI.Utilities
Imports DotNetNuke.UI.Utilities.DataCache
Imports DotNetNuke.Entities.Portals


Namespace TN.Module.FormerStudents
    Partial Public Class EditProfile
        Inherits DotNetNuke.Entities.Modules.PortalModuleBase


#Region "property"
        Public Property U_Id() As Integer
            Get
                If Not ViewState.Item("U_Id") Is Nothing Then
                    Dim x As Integer = Null.NullInteger
                    Try
                        x = Integer.Parse(ViewState.Item("U_Id"))
                    Catch ex As System.Exception
                        x = Null.NullInteger
                    End Try
                    Return x
                Else
                    ViewState.Add("U_Id", Null.NullInteger.ToString)
                    Return Null.NullInteger
                End If
            End Get
            Set(ByVal Value As Integer)
                ViewState.Item("U_Id") = Value.ToString
            End Set
        End Property
#End Region

#Region "Public Methods"

        ''' <summary>
        ''' Cập nhật thông tin hồ sơ
        ''' </summary>
        ''' <param name="U_Id"></param>
        ''' <remarks>
        ''' thông tin user có 2 phần. thông tin trong bảng user và trong bảng profile.
        ''' chú ý phải cập nhật cả 2 bảng này mới đủ
        ''' </remarks>
        Public Sub SaveUserAndProfile(ByVal U_Id As Integer)
            Dim objUserInfo As UserInfo = UserController.GetUserById(PortalId, U_Id)

            objUserInfo.FirstName = txtTen.Text.Trim
            objUserInfo.Profile.SetProfileProperty("MiddleName", txtDem.Text.Trim)
            objUserInfo.LastName = txtHo.Text.Trim
            Dim birthDay As String = ddlDay.SelectedValue.ToString + "/" + ddlMonth.SelectedValue.ToString + "/" + ddlYear.Text
            objUserInfo.Profile.SetProfileProperty("DateOfBirth", birthDay)
            If drdSex.SelectedValue = "Nam" Then
                objUserInfo.Profile.SetProfileProperty("Sex", "Nam")
            Else
                objUserInfo.Profile.SetProfileProperty("Sex", "Nữ")
            End If
            objUserInfo.Email = txtEmail.Text.Trim
            objUserInfo.Profile.SetProfileProperty("Telephone", txtPhone.Text)
            objUserInfo.Profile.SetProfileProperty("Cell", txtCell.Text)
            objUserInfo.Profile.SetProfileProperty("interpret", txtDes.Text)

            If chkApprove.Enabled Then
                'Quyết định xem người dùng này có được duyệt hay không
                objUserInfo.Membership.Approved = IIf(chkApprove.Checked, True, False)
            End If

            UserController.UpdateUser(PortalId, objUserInfo)
            ProfileController.UpdateUserProfile(objUserInfo)
        End Sub

        ''' <summary>
        ''' Load dữ liệu phòng ban
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub BindDepartment()
            Dim listDepartment As ArrayList = (New PhongBanController).GetAll(PortalId)
            Dim listDepartment_User As ArrayList = Nothing
            drgViewData.DataSource = listDepartment
            drgViewData.DataBind()
        End Sub

        ''' <summary>
        ''' Lấy danh sách Vai trò(Role) theo Nhóm quyền
        ''' </summary>
        ''' <param name="RoleGroupId"></param>
        ''' <remarks></remarks>
        Public Sub BindRole(ByVal RoleGroupId As Integer)
            Dim ctl As RoleController = New RoleController
            Dim listOfRole As ArrayList = ctl.GetRolesByGroup(PortalId, RoleGroupId)
            chkListRole.DataSource = listOfRole
            chkListRole.DataTextField = "Description"
            chkListRole.DataValueField = "RoleId"
            chkListRole.DataBind()
        End Sub

        ''' <summary>
        ''' Lưu lại vai trò của người dùng (Mỗi vai trò tương ứng với 1 Role)
        ''' Xóa vai trò cũ
        ''' Thêm vai trò mới
        ''' </summary>
        ''' <param name="U_Id"></param>
        ''' <remarks></remarks>
        Public Sub Save_UserRole(ByVal U_Id As Integer)
            Dim ctlRole As RoleController = New RoleController

            For Each item As ListItem In chkListRole.Items
                If item.Selected Then
                    ctlRole.AddUserRole(PortalId, U_Id, item.Value, Null.NullDate)
                Else
                    ctlRole.DeleteUserRole(PortalId, U_Id, item.Value)
                End If
            Next
        End Sub

        ''' <summary>
        ''' Xóa phòng ban cũ của người dùng trước khi lưu
        ''' </summary>
        ''' <param name="U_Id"></param>
        ''' <remarks></remarks>
        Public Sub Remove_OledDepartentForUser(ByVal U_Id As Integer)
            Dim ctl As PhongBanNguoiDungController = New PhongBanNguoiDungController
            Dim listOfUserDept As ArrayList = ctl.GetByNguoiDung(U_Id, PortalId)
            For Each obj As PhongBanNguoiDungInfo In listOfUserDept
                ctl.Delete(obj.Id)
            Next
        End Sub

        ''' <summary>
        ''' Lưu lại thông tin phòng ban và chức vụ, nhiệm vụ cho người dùng
        ''' </summary>
        ''' <param name="U_Id"></param>
        ''' <remarks></remarks>
        Public Sub Save_UserDepartment(ByVal U_Id As Integer)
            Dim ctl As PhongBanNguoiDungController = New PhongBanNguoiDungController
            Dim chkLaNguoiKy As CheckBox
            Dim chkNhanVB As CheckBox
            Dim chkLanhDao As CheckBox
            Dim chkChon As CheckBox
            Dim ddlChucVu As DropDownList
            For Each obj As DataGridItem In drgViewData.Items
                chkChon = CType(obj.FindControl("chkChon"), CheckBox)
                If chkChon.Checked Then
                    ddlChucVu = CType(obj.FindControl("ddlChucVu"), DropDownList)
                    chkLaNguoiKy = CType(obj.FindControl("chkLaNguoiKy"), CheckBox)
                    chkNhanVB = CType(obj.FindControl("chkNhanVB"), CheckBox)
                    chkLanhDao = CType(obj.FindControl("chkLanhDao"), CheckBox)

                    'Luu thong tin Phongban - nguoi dung - chuc vu
                    Dim objPhongbanNguoidung As PhongBanNguoiDungInfo = New PhongBanNguoiDungInfo
                    objPhongbanNguoidung.UserId = U_Id
                    objPhongbanNguoidung.PhongBan = drgViewData.DataKeys.Item(obj.ItemIndex)
                    If ddlChucVu.Items.Count > 0 Then
                        objPhongbanNguoidung.ChucVu = ddlChucVu.SelectedValue
                    End If
                    objPhongbanNguoidung.LaNguoiKy = chkLaNguoiKy.Checked
                    objPhongbanNguoidung.LaLanhDao = chkLanhDao.Checked
                    objPhongbanNguoidung.LaNguoiNhanVB = chkNhanVB.Checked
                    objPhongbanNguoidung.PortalId = PortalId
                    ctl.Insert(objPhongbanNguoidung)
                End If
            Next
        End Sub

        ''' <summary>
        ''' Gắn chức vụ theo phòng ban vào drodown list
        ''' </summary>
        ''' <param name="ddl"></param>
        ''' <param name="DepartmentId"></param>
        ''' <remarks></remarks>
        Private Sub BindDdlChucVu(ByVal ddl As DropDownList, ByVal DepartmentId As Integer)
            ddl.DataSource = New PhongBanChucVuController().GetByPhongBan(DepartmentId)
            ddl.DataTextField = "TenChucVu"
            ddl.DataValueField = "ChucVu"
            ddl.DataBind()
        End Sub

        ''' <summary>
        ''' Lấy tên rolename theo roleid
        ''' </summary>
        ''' <param name="RoleId">role id</param>
        ''' <returns>Trả lại tên role - role name</returns>
        ''' <remarks></remarks>
        Public Function GetRoleNameById(ByVal RoleId As Integer) As String
            Dim ctlRole As RoleController = New RoleController
            Dim obj As RoleInfo = ctlRole.GetRole(RoleId, PortalId)
            Return obj.RoleName
        End Function

        ''' <summary>
        ''' Bind năm vào combobox
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub BindYear()
            For i As Integer = 1900 To 2010
                ddlYear.Items.Add(New ListItem(i.ToString, i))
            Next
        End Sub

        ''' <summary>
        ''' Khởi tạo hồ sơ người dùng
        ''' </summary>
        ''' <param name="objUserInfo"></param>
        ''' <remarks></remarks>
        Public Sub IntitProfile(ByVal objUserInfo As UserInfo)
            'Thong tin co ban
            'TrungNS: Binding from Property table

            txtUserName.Text = TNFormerStudentHepler.GetUserName(objUserInfo.Username)
            txtTen.Text = objUserInfo.FirstName
            txtHo.Text = objUserInfo.LastName
            txtDem.Text = objUserInfo.Profile.GetPropertyValue("MiddleName")
            Dim strBirthDay As String = objUserInfo.Profile.GetPropertyValue("DateOfBirth")
            If Not String.IsNullOrEmpty(strBirthDay) Then
                Dim arrDate As String() = strBirthDay.Split("/")
                If arrDate.Count > 2 Then
                    ddlDay.SelectedValue = arrDate(0)
                    ddlMonth.SelectedValue = arrDate(1)
                    ddlYear.SelectedValue = arrDate(2)
                End If
            End If
            drdSex.SelectedValue = objUserInfo.Profile.GetPropertyValue("Sex")
            'Thong tin lien he
            txtEmail.Text = objUserInfo.Email
            txtPhone.Text = objUserInfo.Profile.GetPropertyValue("Telephone")
            txtCell.Text = objUserInfo.Profile.GetPropertyValue("Cell")
            txtDes.Text = objUserInfo.Profile.GetPropertyValue("interpret")

            'Load vai trò của người dùng (Role)
            For Each item As ListItem In chkListRole.Items
                If objUserInfo.IsInRole(GetRoleNameById(item.Value)) Then
                    item.Selected = True
                End If
            Next

            'Load Phòng ban của người dung
            Dim ctlPhongbanNguoidung As PhongBanNguoiDungController = New PhongBanNguoiDungController
            Dim objPhongbanNguoidung As PhongBanNguoiDungInfo = Nothing

            Dim chkLaNguoiKy As CheckBox
            Dim chkNhanVB As CheckBox
            Dim chkLanhDao As CheckBox
            Dim chkChon As CheckBox
            Dim ddlChucVu As DropDownList
            For Each obj As DataGridItem In drgViewData.Items
                objPhongbanNguoidung = ctlPhongbanNguoidung.GetByUserIdAnDepartmentId(U_Id, drgViewData.DataKeys.Item(obj.ItemIndex), PortalId)
                chkChon = CType(obj.FindControl("chkChon"), CheckBox)
                ddlChucVu = CType(obj.FindControl("ddlChucVu"), DropDownList)
                chkLaNguoiKy = CType(obj.FindControl("chkLaNguoiKy"), CheckBox)
                chkNhanVB = CType(obj.FindControl("chkNhanVB"), CheckBox)
                chkLanhDao = CType(obj.FindControl("chkLanhDao"), CheckBox)
                If Not objPhongbanNguoidung Is Nothing Then
                    chkChon.Checked = True
                    chkLaNguoiKy.Checked = objPhongbanNguoidung.LaNguoiKy
                    chkLanhDao.Checked = objPhongbanNguoidung.LaLanhDao
                    chkNhanVB.Checked = objPhongbanNguoidung.LaNguoiNhanVB
                    If ddlChucVu.Items.Count > 0 Then
                        ddlChucVu.SelectedValue = objPhongbanNguoidung.ChucVu
                    End If
                End If
            Next
        End Sub
#End Region

#Region "Event Handler"
        ''' <summary>
        ''' Load trang, khởi tạo dữ liệu và gán dữ liệu người dùng vào các điều khiển để cập nhật
        ''' </summary>
        ''' <param name="sender"></param>
        ''' <param name="e"></param>
        ''' <remarks></remarks>
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Try
                Dim slanguage As String = TNFormerStudentHepler.GetCurrentLanguage(Response)

                If Not IsPostBack Then
                    BindYear()
                    BindDepartment()

                    'Load vai trò
                    Dim roleGroupId As Integer = Null.NullInteger
                    If CType(Settings(TNFormerStudentContants.RoleGroupIdEditSetting + slanguage + PortalId.ToString), String) <> "" Then
                        roleGroupId = Convert.ToInt32(Settings(TNFormerStudentContants.RoleGroupIdEditSetting + slanguage + PortalId.ToString))
                    End If
                    BindRole(roleGroupId)

                    'Load thông tin người dùng
                    If Not String.IsNullOrEmpty(Request.QueryString("Id")) Then
                        U_Id = Integer.Parse(Request.QueryString("Id").ToString)
                    Else
                        U_Id = UserId
                    End If
                    Dim oUser As UserInfo = UserController.GetUserById(PortalId, U_Id)
                    IntitProfile(oUser)

                    'Nếu người dùng hiện tại không phải là người có vai trò quản trị thì không được phép chỉnh sửa thông tin
                    'chức vụ, vai trò
                    If UserId = 1 Or UserInfo.IsInRole("Administrators") Or UserInfo.IsInRole("Manager") Or (UserId = PortalSettings.AdministratorId) Then 'TrungNS: Add CHECK if User is Portal Administrator
                        drgViewData.Enabled = True
                        chkListRole.Enabled = True
                        chkApprove.Enabled = True
                    Else
                        drgViewData.Enabled = False
                        chkListRole.Enabled = False
                        chkApprove.Enabled = False
                    End If

                    If Not Request.UrlReferrer Is Nothing Then
                        ViewState("UrlReferrer") = Request.UrlReferrer.ToString()
                    End If
                End If
            Catch ex As Exception
                ProcessModuleLoadException(Me, ex)
            End Try
        End Sub

        ''' <summary>
        ''' Cập nhật thông tin về người dùng
        ''' </summary>
        ''' <param name="sender"></param>
        ''' <param name="e"></param>
        ''' <remarks></remarks>
        Private Sub btnSignUp_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSignUp.Click
            Try
                'Cập nhật thông tin người dùng
                SaveUserAndProfile(U_Id)

                'Nếu là người quản trị mới có quyền cập nhật lại thông tin phòng ban, vai trò, chức vụ cho người dùng.
                'Điều này đồng nghĩa với các control phải enable thì mới được lưu thông tin trên đó. tương tự cho
                'nút duyệt trong hàm SetProfileAndRoleOfFormerStudent
                If drgViewData.Enabled Then
                    'Xóa chức vụ và phòng ban cũ
                    Remove_OledDepartentForUser(U_Id)
                    'Lưu chức vụ và phòng ban vừa được thiết lập
                    Save_UserDepartment(U_Id)
                End If

                'lưu vai trò người dùng
                If chkListRole.Enabled Then
                    Save_UserRole(U_Id)
                End If

                RemoveCache("UserInfo:" & U_Id.ToString)

                'Thông báo thành công
                Dim sMessage As String = "Cập nhật thành công"
                'DotNetNuke.UI.Skins.Skin.AddModuleMessage(Me, "Thông báo :", "Bạn đã cập nhật thành công", DotNetNuke.UI.Skins.Controls.ModuleMessage.ModuleMessageType.GreenSuccess)
                ClientAPI.RegisterStartUpScript(Me.Page, "showmessage", "<script>alert('" + sMessage + "');</script>")
            Catch ex As Exception
                ProcessModuleLoadException(Me, ex)
            End Try
        End Sub

        ''' <summary>
        ''' Bind dữ liệu vào lưới
        ''' </summary>
        ''' <param name="sender"></param>
        ''' <param name="e"></param>
        ''' <remarks></remarks>
        Private Sub drgViewData_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles drgViewData.ItemDataBound
            Try
                If e.Item.ItemType = ListItemType.AlternatingItem Or e.Item.ItemType = ListItemType.Item Then
                    Dim chkLaNguoiKy As CheckBox
                    Dim chkNhanVB As CheckBox
                    Dim chkLanhDao As CheckBox
                    Dim ddlChucVu As DropDownList
                    ddlChucVu = CType(e.Item.FindControl("ddlChucVu"), DropDownList)
                    chkLaNguoiKy = CType(e.Item.FindControl("chkLaNguoiKy"), CheckBox)
                    chkNhanVB = CType(e.Item.FindControl("chkNhanVB"), CheckBox)
                    chkLanhDao = CType(e.Item.FindControl("chkLanhDao"), CheckBox)
                    ' bindata detail
                    BindDdlChucVu(ddlChucVu, drgViewData.DataKeys.Item(e.Item.ItemIndex))
                End If
            Catch ex As Exception
                ProcessModuleLoadException(Me, ex)
            End Try
        End Sub

        ''' <summary>
        ''' Quay về trang trước
        ''' </summary>
        ''' <param name="sender"></param>
        ''' <param name="e"></param>
        ''' <remarks></remarks>
        Private Sub btnReturn_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnReturn.Click
            Try
                Response.Redirect(Convert.ToString(ViewState("UrlReferrer")), True)
            Catch ex As Exception
                ProcessModuleLoadException(Me, ex)
            End Try
        End Sub
#End Region

    End Class
End Namespace
